package com.leetcode.multithreading.licm.retry;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * @description:
 *
 *  TODO 把请求和返回的信息存缓存里。定时器读缓存，看间隔时间，设置超时时间，如果哪个请求没有对应的返回就重试呢
 *
 *
 * @author: licm
 * @create: 2021-08-12 19:29
 **/

@Slf4j
@Service
public class RetryServiceImpl implements RetryService {


    public static void main(String[] args) {


        RetryServiceImpl iRetryTest = new RetryServiceImpl();
        UserInfo user = new UserInfo("Jack");
        Task task = new Task() {

            @Override
            public void run() throws Exception {
                user.setName("Henry");
                log.info("执行业务,给员工修改名称为：" + user.getName());
                Integer a = 1 / 0;

            }

            //最终失败后，支持回滚业务
            @Override
            public void retryFailed(Throwable e) {
                user.setName("Jack");
                log.info("重试失败，业务数据回滚...");
                log.info("用户名称为：" + user.getName());
            }

            @Override
            public Object snapshot() {
                return user;
            }
        };
        iRetryTest.executeBusiness(task,1);

    }
    //需要重试的业务方法
//    @Override
//    private void executeBusiness(RetryUtils retryUtils, UserInfo user) {
//
//        retryUtils.doRetry(new int[]{6, 12}, new Task() {
//            @Override
//            public void run() throws Exception {
//                user.setName("Henry");
//                log.info("执行业务,给员工修改名称为：" + user.getName());
//                Integer a = 1 / 0;
//
//            }
//
//            //最终失败后，支持回滚业务
//            @Override
//            public void retryFailed(Throwable e) {
//                user.setName("Jack");
//                log.info("重试失败，业务数据回滚...");
//                log.info("用户名称为：" + user.getName());
//            }
//
//            @Override
//            public Object snapshot() {
//                return user;
//            }
//        });
//    }

    //需要重试的业务方法
    @Override
    public void executeBusiness(Task task, int[] retryDelaySeconds) {
        RetryUtils retryUtils = new RetryUtils();
        retryUtils.doRetry(retryDelaySeconds, task);
    }

    @Override
    public void executeBusiness(Task task, int maxRetryTime) {
        RetryUtils retryUtils = new RetryUtils();
        retryUtils.doRetry(maxRetryTime,task);
    }

    @Override
    public void executeBusiness(Task task) {
        RetryUtils retryUtils = new RetryUtils();
        retryUtils.doRetry(task);


    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static
    class UserInfo {
        private String name;
    }
}
